const obj={
    name:'菠萝头',
    food:'甜品',
    sex:'男'
}
// const food=obj.food;
// es6 提供了优雅的api解构
let {name,food}=obj;
console.log(name,food);
// 解构
// 数组解构
let [foo, [[bar], baz]] = [1, [[2], 3]];
let [foos] = [];//foo的值都会等于undefined
function f() {
    console.log('aaa');
  }
  
  let [x = f()] = [1];
  //因为x能取到值，所以函数f根本不会执行

// 对象解构
let { bar1, foo1 } = { foo1: "aaa", bar1: "bbb" };
foo1 // "aaa"
bar1 // "bbb"

let { baz1 } = { foo: "aaa", bar: "bbb" };
baz1 // undefined
// 对象的解构赋值是下面形式的简写
let { foo2: foo2, bar2: bar2 } = { foo2: "aaa", bar2: "bbb" };
let { foo3: baz3 } = { foo3: "aaa", bar3: "bbb" };
baz3 // "aaa"
foo3 // error: foo is not defined
//foo是匹配的模式，baz才是变量。真正被赋值的是变量baz，而不是模式foo。
// 3. 字符串的解构赋值
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
// 4. 数值和布尔值的解构赋值
let {toString: s1} = 123;
s1 === Number.prototype.toString // true

let {toString: s2} = true;
s2 === Boolean.prototype.toString // true
// 5. 函数参数的解构赋值
function add([x, y]){
    return x + y;
  }
  
  add([1, 2]); // 3
  
  function move({x = 0, y = 0} = {}) {
    return [x, y];
  }
  
  move({x: 3, y: 8}); // [3, 8]
  move({x: 3}); // [3, 0]
  move({}); // [0, 0]
  move(); // [0, 0]
  function move1({x, y} = { x: 0, y: 0 }) {
    return [x, y];
  }
  
  move1({x: 3, y: 8}); // [3, 8]
  move1({x: 3}); // [3, undefined]
  move1({}); // [undefined, undefined]
  move1(); // [0, 0]
// 提取json数据
  let jsonData = {
    id: 42,
    status: "OK",
    data: [867, 5309]
  };
  
  let { id, status, data: number } = jsonData;
  
  console.log(id, status, number);
  // 42, "OK", [867, 5309]
  
// let name='123';
// var a=1;
// var a=2;
function introduce({name,food}){
    console.log(`${name},旅梦的好朋友，大佬，最喜欢的事物${food}`);
}
introduce(obj);